static void save_segments(struct vcpu *v)
{
struct cpu_user_regs *regs = &v->arch.guest_context.user_regs;
+
+ if ( VMX_DOMAIN(v) )
+ rdmsrl(MSR_SHADOW_GS_BASE, v->arch.arch_vmx.msr_content.shadow_gs);
+
__asm__ __volatile__ ( "movl %%ds,%0" : "=m" (regs->ds) );
__asm__ __volatile__ ( "movl %%es,%0" : "=m" (regs->es) );
__asm__ __volatile__ ( "movl %%fs,%0" : "=m" (regs->fs) );
local_irq_enable();
- if ( !VMX_DOMAIN(next) )
+ if ( VMX_DOMAIN(next) )
+ {
+ vmx_restore_msrs(next);
+ }
+ else
{
load_LDT(next);
load_segments(realprev, next);